#include "mqtt.h"
#include <qhostaddress.h>
MQTT::MQTT() : ZNDeviceWork()
{
    this->devType = MQTT_NAME;
    this->mqttClient = new QMqttClient();
    workTimerID = startTimer(1000);
}
MQTT::~MQTT()
{
    delete this->mqttClient;
}
//QJsonObject MQTT::getDevDataStruct(QString dataName)
//{
//    if(dataMap.count(dataName))
//    {

//        S7_Data* data = qobject_cast<S7_Data*>(dataMap[dataName]);

//        QJsonObject jsObj;
//        QJsonArray jsObjLinkArray;
//        jsObj.insert("dataName",dataName);
//        //jsObj.insert("area",QString::number(data->area));//只能读取DB块

//        QJsonObject dbNumber;
//        dbNumber.insert("name","DB块编号");
//        dbNumber.insert("type","number");
//        dbNumber.insert("max","100000000");
//        dbNumber.insert("min","0");
//        dbNumber.insert("value",QString::number(data->dbNumber));
//        jsObj.insert("dbNumber",dbNumber);

//        QJsonObject start;
//        start.insert("name","起始地址");
//        start.insert("type","number");
//        start.insert("max","100000");
//        start.insert("min","0");
//        start.insert("value",QString::number(data->start));
//        jsObj.insert("start",start);

//        QJsonObject count;
//        count.insert("name","数量");
//        count.insert("type","number");
//        count.insert("max","10000");
//        count.insert("min","1");
//        count.insert("value",QString::number(data->count));
//        jsObj.insert("count",count);


////        switch(data->typeIndex)
////        {
////            case ZNDataBase::TypeIndex::Bool: index = "0";break;
////            case ZNDataBase::TypeIndex::Int8: index = "1";break;
////            case ZNDataBase::TypeIndex::Uint8: index = "2";break;
////            case ZNDataBase::TypeIndex::Int16:index = "3";break;
////            case ZNDataBase::TypeIndex::Uint16:index = "4";break;
////            case ZNDataBase::TypeIndex::Int32:index = "5";break;
////            case ZNDataBase::TypeIndex::Uint32:index = "6";break;
////            case ZNDataBase::TypeIndex::Int64:index = "7";break;
////            case ZNDataBase::TypeIndex::Uint64:index = "8";break;
////            case ZNDataBase::TypeIndex::Float:index = "9";break;
////            case ZNDataBase::TypeIndex::Double:index = "10";break;
////        }
//        QJsonObject dataType;
//        dataType.insert("name","数据类型");
//        dataType.insert("type","select");
//        dataType.insert("options","Bool,Int8,Uint8,Int16,Uint16,Int32,Uint32,Int64,Uint64,Float,Double");
//        dataType.insert("value",QString::number(data->typeIndex - 1));
//        jsObj.insert("dataType",dataType);

//        QJsonObject rw;
//        rw.insert("name","操作类型");
//        rw.insert("type","select");
//        rw.insert("options","读,写");
//        rw.insert("value",QString::number(data->rw));
//        jsObj.insert("rw",rw);

//        QJsonObject bit;
//        bit.insert("name","位地址(数据类型为Bool时有效)");
//        bit.insert("type","number");
//        bit.insert("max","7");
//        bit.insert("min","0");
//        bit.insert("value",QString::number(data->bit));
//        jsObj.insert("bit",bit);

//        QJsonObject interval;
//        interval.insert("name","数据更新间隔");
//        interval.insert("type","number");
//        interval.insert("max","100000000");
//        interval.insert("min","10");
//        interval.insert("value",QString::number(data->getInterval()));
//        jsObj.insert("interval",interval);

//        foreach(QString linkName, data->linkMap.keys())
//        {
//            jsObjLinkArray.append(linkName);
//        }
//        jsObj.insert("linkList",jsObjLinkArray);

//        return jsObj;
//    }
//    else
//    {
//        QJsonObject jsObj;
//        QJsonArray data1LinkArray;
//        jsObj.insert("dataName",dataName);
//        //jsObj.insert("area",QString::number(data->area));//只能读取DB块

//        QJsonObject dbNumber;
//        dbNumber.insert("name","DB块编号");
//        dbNumber.insert("type","number");
//        dbNumber.insert("max","100000000");
//        dbNumber.insert("min","0");
//        dbNumber.insert("value","0");
//        jsObj.insert("dbNumber",dbNumber);

//        QJsonObject start;
//        start.insert("name","起始地址");
//        start.insert("type","number");
//        start.insert("max","100000");
//        start.insert("min","0");
//        start.insert("value","0");
//        jsObj.insert("start",start);

//        QJsonObject count;
//        count.insert("name","数量");
//        count.insert("type","number");
//        count.insert("max","10000");
//        count.insert("min","1");
//        count.insert("value","1");
//        jsObj.insert("count",count);

//        QJsonObject dataType;
//        dataType.insert("name","数据类型");
//        dataType.insert("type","select");
//        dataType.insert("options","Bool,Int8,Uint8,Int16,Uint16,Int32,Uint32,Int64,Uint64,Float,Double");
//        dataType.insert("value","0");
//        jsObj.insert("dataType",dataType);

//        QJsonObject rw;
//        rw.insert("name","操作类型");
//        rw.insert("type","select");
//        rw.insert("options","读,写");
//        rw.insert("value","0");
//        jsObj.insert("rw",rw);

//        QJsonObject bit;
//        bit.insert("name","位地址(数据类型为Bool时有效)");
//        bit.insert("type","number");
//        bit.insert("max","7");
//        bit.insert("min","0");
//        bit.insert("value","0");
//        jsObj.insert("bit",bit);

//        QJsonObject interval;
//        interval.insert("name","数据更新间隔");
//        interval.insert("type","number");
//        interval.insert("max","100000000");
//        interval.insert("min","10");
//        interval.insert("value","1000");
//        jsObj.insert("interval",interval);

//        jsObj.insert("linkList",data1LinkArray);

//        return jsObj;
//    }
//}
//QJsonObject S7::getDevJson()
//{
//    QJsonObject obj = ZNDeviceWork::getDevJson();
//    QJsonObject config;
//    QJsonArray dataListArray;

//    QJsonObject IP;
//    IP.insert("name","IP 地址");
//    IP.insert("type","input");
//    IP.insert("value",this->remAddress);
//    config.insert("IP",IP);

//    QJsonObject rack;
//    rack.insert("name","机架号");
//    rack.insert("type","number");
//    rack.insert("max","10000");
//    rack.insert("min","0");
//    rack.insert("value",QString::number(this->rack));
//    config.insert("rack",rack);

//    QJsonObject slot;
//    slot.insert("name","槽号");
//    slot.insert("type","number");
//    slot.insert("max","10000");
//    slot.insert("min","0");
//    slot.insert("value",QString::number(this->slot));
//    config.insert("slot",slot);

//    foreach(QString dataName, dataMap.keys())
//    {
//        dataListArray.append(getDevDataStruct(dataName));
//    }
//    obj.insert("config", config);
//    obj.insert("dataList", dataListArray);
//    obj.insert("dataNode", this->getDevDataStruct(""));

//    return obj;
//}
//QString S7::configDev(QJsonObject config)
//{

//    if(config.contains("IP") && config.contains("rack") && config.contains("slot"))
//    {
//        QString ip = config.value("IP").toObject().value("value").toString();
//        if(ip == "")
//        {
//            return "ip不能为空";
//        }
//        QHostAddress test;
//        if(!test.setAddress(ip))
//        {
//            return "ip地址错误";
//        }

//        int rack = config.value("rack").toObject().value("value").toString().toInt();
//        int slot = config.value("slot").toObject().value("value").toString().toInt();

//        connect(ip,rack,slot);
//        return "true";
//    }
//    return "参数错误";
//}
//QString S7::addData(QJsonObject jsObj)
//{
//    if(jsObj.contains("dataName") && jsObj.contains("dbNumber") && jsObj.contains("start") \
//       && jsObj.contains("count") && jsObj.contains("dataType") && jsObj.contains("bit") \
//       && jsObj.contains("interval") && jsObj.contains("linkList") && jsObj.contains("rw"))
//    {
//        int dbNumber = jsObj.value("dbNumber").toObject().value("value").toString().toInt();
//        int start = jsObj.value("start").toObject().value("value").toString().toInt();
//        uint8_t count = jsObj.value("count").toObject().value("value").toString().toInt();
//        uint8_t dataType = jsObj.value("dataType").toObject().value("value").toString().toInt() + 1;
//        uint8_t rw = jsObj.value("rw").toObject().value("value").toString().toInt();
//        uint8_t bit = jsObj.value("bit").toObject().value("value").toString().toInt();

//        int interval = jsObj.value("interval").toObject().value("value").toString().toInt();


//        if(dbNumber < 0)
//        {
//            return "DB块编号地址错误";
//        }
//        if(start < 0)
//        {
//            return "起始地址错误";
//        }
//        if(count < 1 || count > 125)
//        {
//            return "数量范围 1-125";
//        }
//        if(!(dataType > ZNDataBase::TypeIndex::None && dataType < ZNDataBase::TypeIndex::typeErr))
//        {
//            return "数据类型错误";
//        }
//        if(rw > 1)
//        {
//            return "操作类型错误";
//        }
//        if(bit > 7)
//        {
//            return "位寻址范围 0-7";
//        }

//        if(interval < 10)
//        {
//            return "数据更新间隔不得小于10ms";
//        }
//        QString dataName = jsObj.value("dataName").toString();
//        if(dataName == "")
//        {
//            return "标签名称不能为空";
//        }
//        if(!dataMap.count(dataName))
//        {
//            QStringList l = dataName.split(".");
//            if(l.length() > 1)
//            {
//                return "标签名称不能有“.”";
//            }
//            QString absDataName = DATANAME(dataName);
//            QJsonArray linkList = jsObj.value("linkList").toArray();
//            for (int i = 0; i < linkList.count(); i++)
//            {
//                QString linkName = linkList.at(i).toString();
//                if(linkName == absDataName)
//                    return "数据不能连接自己";

//                QStringList l = linkName.split(".");
//                if(l.length() != 2)
//                {
//                    return "连接名必须为“设备名”.“数据名”的形式";
//                }
//            }
//            S7_Data* data = new S7_Data(absDataName, (ZNDataBase::TypeIndex)dataType, count, this);
//            //QObject::connect(data,&ZNDataBase::devSignal,this, &::S7::devSlot, Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection));
//            //data->area = area;
//            data->dbNumber = dbNumber;
//            data->start = start;
//            data->bit = bit;
//            data->rw = rw;
//            data->setInterval(interval);
//            for (int i = 0; i < linkList.count(); i++)
//            {
//                data->addLink(linkList.at(i).toString());
//            }
//            dataMap.insert(dataName, data);
//            return "true";
//        }
//        return "标签名重复";
//    }
//    return "参数错误";
//}
//QString S7::configData(QString name, QJsonObject jsObj)
//{
//    if(jsObj.contains("dataName") && jsObj.contains("dbNumber") && jsObj.contains("start") \
//       && jsObj.contains("count") &&jsObj.contains("dataType") && jsObj.contains("bit") \
//       && jsObj.contains("interval") && jsObj.contains("linkList") && jsObj.contains("rw"))
//    {
//        if(dataMap.count(name))
//        {
//            int dbNumber = jsObj.value("dbNumber").toObject().value("value").toString().toInt();
//            int start = jsObj.value("start").toObject().value("value").toString().toInt();
//            uint8_t count = jsObj.value("count").toObject().value("value").toString().toInt();
//            uint8_t dataType = jsObj.value("dataType").toObject().value("value").toString().toInt() + 1;
//            uint8_t rw = jsObj.value("rw").toObject().value("value").toString().toInt();
//            uint8_t bit = jsObj.value("bit").toObject().value("value").toString().toInt();
//            int interval = jsObj.value("interval").toObject().value("value").toString().toInt();

//            if(dbNumber < 0)
//            {
//                return "dbNumber 地址错误";
//            }
//            if(start < 0)
//            {
//                return "start 地址错误";
//            }
//            if(count < 1 || count > 125)
//            {
//                return "count范围 1-125";
//            }
//            if(!(dataType > ZNDataBase::TypeIndex::None && dataType < ZNDataBase::TypeIndex::typeErr))
//            {
//                return "数据类型错误";
//            }
//            if(rw > 1)
//            {
//                return "操作类型错误";
//            }
//            if(bit > 7)
//            {
//                return "bit范围 0-7";
//            }

//            if(interval < 10)
//            {
//                return "interval不得小于10ms";
//            }
//            QString dataName = jsObj.value("dataName").toString();
//            if(dataName == "")
//            {
//                return "标签名称不能为空";
//            }
//            if(name != dataName)
//            {
//                QStringList l = dataName.split(".");
//                if(l.length() > 1)
//                {
//                    return "标签名称不能有“.”";
//                }
//                if(!dataMap.count(dataName))//修改名称
//                {
//                    S7_Data* data = qobject_cast<S7_Data*>(dataMap[name]);
//                    data->setName(DATANAME(dataName));
//                    dataMap.remove(name);
//                    dataMap.insert(dataName,data);
//                }
//                else
//                {
//                    return dataName+"标签已存在";
//                }
//            }
//            S7_Data* data = qobject_cast<S7_Data*>(dataMap[dataName]);

//            //data->area = area;
//            data->dbNumber = dbNumber;
//            data->start = start;
//            data->bit = bit;
//            data->rw = rw;
//            data->setInterval(interval);
//            data->setType(ZNDataBase::TypeIndex::Int16, count);
//            data->delAllLink();

//            QJsonArray linkList = jsObj.value("linkList").toArray();
//            for (int i = 0; i < linkList.count(); i++)
//            {
//                QString linkName = linkList.at(i).toString();
//                if(linkName == data->getName())
//                    return "数据不能连接自己";

//                QStringList l = linkName.split(".");
//                if(l.length() != 2)
//                {
//                    return "连接名必须为“设备名”.“数据名”的形式";
//                }
//            }
//            for (int i = 0; i < linkList.count(); i++)
//            {
//                data->addLink(linkList.at(i).toString());
//            }
//            return "修改成功";
//        }
//        return "找不到\"" + name + "\" 数据";
//    }
//    return "参数错误";
//}
//QString S7::removeData(QString name)
//{
//    if(dataMap.count(name))
//    {
//        S7_Data* data = qobject_cast<S7_Data*>(dataMap[name]);
//        delete data;
//        dataMap.remove(name);

//        return "true";
//    }
//    return "找不到 " + name + " 标签";
//}
//void S7::rename(QString newName)
//{
//    this->name = newName;
//    QMap<QString, ZNDataBase*>::Iterator iter;
//    for(iter = dataMap.begin(); iter != dataMap.end(); ++iter)
//    {
//       iter.value()->setName(DATANAME(iter.key()));
//    }

//}
//int S7::readArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData)
//{
//    if (!ts7Client->Connected() || !linkFlag)
//    {
//        return ZNDataBase::DataErrType::Offline;
//    }
//    int retval = ts7Client->ReadArea(Area, DBNumber, Start, Amount, WordLen, pUsrData);
//    if(retval != 0)
//    {
//        linkFlag = false;
//    }
//     return retval;
//}
//int S7::writeArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData)
//{
//    if (!ts7Client->Connected() || !linkFlag)
//    {
//        return ZNDataBase::DataErrType::Offline;
//    }
//    int retval = ts7Client->WriteArea(Area, DBNumber, Start, Amount, WordLen, pUsrData);
//    if(retval != 0)
//    {
//        linkFlag = false;
//    }
//     return retval;
//}
//int S7::connect(QString RemAddress, int Rack, int Slot)
//{
//    if(this->remAddress != RemAddress && linkFlag)
//    {
//        ts7Client->Disconnect();
//        linkFlag = false;
//    }
//    this->remAddress = RemAddress;
//    this->rack = Rack;
//    this->slot = Slot;
//    if (!linkFlag)
//    {
//        int retval = ts7Client->ConnectTo(remAddress.toStdString().c_str(), rack, slot);
//        if (retval == 0)
//        {
//            linkFlag = true;
//        }
//        return retval;
//    }
//    return ZNDataBase::DataErrType::NullStrError;
//}
void MQTT::moveToThread(QThread* thread)
{
    ZNDeviceWork::moveToThread(thread);
}

//void S7::timerEvent(QTimerEvent* event)
//{
//    if (workTimerID == event->timerId())
//    {
//        if (!ts7Client->Connected() || !linkFlag)
//        {
//            if (remAddress != "")
//            {
//                int retval = ts7Client->ConnectTo(remAddress.toStdString().c_str(), rack, slot);
//                if (retval != 0)
//                {
//                    return;
//                }
//                    linkFlag = true;
//            }
//            else
//            {
//                return;
//            }
//        }
//    }
//    else
//    {
//       ZNDeviceWork::timerEvent(event);
//    }

//}



